#include <stdlib.h>
#include <stdio.h>
#include "../tools/array.h"

#define TEST_MSG(num, status) { printf("Test %d %s\n", num, status); }
#define TEST(num) \
{ \
	if (test ## num()) { TEST_MSG(num, "FAILED"); } \
	else { TEST_MSG(num, "passed"); } \
}

int test1();
int test2();
int test3();
int test4();
int test5();

int main()
{
	TEST(1);
	TEST(2);
	TEST(3);
	TEST(4);
	TEST(5);
	printf("End of test\n");
	return 0;
}

int test1()
{
	/*create and delete*/
	array_t *arr = NULL;
	arr = array_create(200);
	if (arr ==  NULL) return 1;
	array_delete(&arr);
	return 0;
}

int test2()
{
	/*set and get integer*/
	array_t *arr = NULL;
	arr = array_create(10);
	array_set_elem_int(arr, 5, 5555555);
	array_set_elem_int(arr, 9, 9999899);
	array_set_elem_int(arr, 0, 1111222);
	if (array_get_elem_int(arr, 0) != 1111222) return 1;
	if (array_get_elem_int(arr, 5) != 5555555) return 1;
	if (array_get_elem_int(arr, 9) != 9999899) return 1;
	array_delete(&arr);
	return 0;
}

int test3()
{
	/*set and get pointer*/
	array_t *arr = NULL;
	arr = array_create(187);
	array_set_elem_ptr(arr, 115, (void*) NULL);
	array_set_elem_ptr(arr, 99, (void*) 123);
	array_set_elem_ptr(arr, 20, (void*) 7777);
	if (array_get_elem_ptr(arr, 99) != (void*) 123) return 1;
	if (array_get_elem_ptr(arr, 115) != (void*) NULL) return 1;
	if (array_get_elem_ptr(arr, 20) != (void*) 7777) return 1;
	array_delete(&arr);
	return 0;
}

int test4()
{
	/*get size*/
	array_t *arr = NULL;
	arr = array_create(116);
	if(array_get_size(arr) != 116) return 1;
	array_delete(&arr);
	return 0;
}

int test5()
{
	/*resize*/
	array_t *arr = NULL;
	arr = array_create(12345);
	array_set_elem_int(arr, 8765, 808080);
	array_set_elem_ptr(arr, 8764, (void*) 2000000000);
	array_resize(arr, 8766);
	if (array_get_elem_int(arr, 8765) != 808080) return 1;
	if (array_get_elem_ptr(arr, 8764) != (void*) 2000000000) return 1;
	if (array_get_size(arr) != 8766) return 1;
	array_resize(arr, 1);
	if (array_get_size(arr) != 1) return 1;
	array_resize(arr, 20);
	if (array_get_size(arr) != 20) return 1;
	return 0;
}
